﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace Wheels
{
    /// <summary>
    /// 提供一些便捷的数组操作方法。
    /// </summary>
    public static class EnumerableUtility
    {
        /// <summary>
        /// 确保一个 IEnumerable 引用并非 null。
        /// 若已经指向 null，此方法将返回兼容的空数组。
        /// </summary>
        public static IEnumerable<T> AntiNull<T>(this IEnumerable<T> source)
        {
            return source ?? new T[] { };
        }

        /// <summary>
        /// 对 <see cref="IEnumerable{T}"/> 的每个元素执行指定操作。
        /// </summary>
        /// <exception cref="ArgumentNullException">action 为 null。</exception>
        public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
        {
            if (null == action) return;

            foreach (var item in source)
                action(item);
        }

        /// <summary>
        /// 生成包含一个重复值的数组。
        /// </summary>
        /// <typeparam name="T">要在结果数组中重复的值的类型。</typeparam>
        /// <param name="source">要重复的值。</param>
        /// <param name="count">在生成数组中重复该值的次数。</param>
        public static T[] RepeatAsArray<T>(this T source, int count)
        {
            // 创建容量为 count 的数组，将 this 循环填入其中。

            var resultArray = new T[count];

            for (int i = 0; i < count; i++)
                resultArray[i] = source;

            return resultArray;
        }

        /// <summary>
        /// 倒转数组。
        /// </summary>
        public static T[] ReverseArray<T>(this T[] source)
        {
            var resultArray = source.ToArray();

            Array.Reverse(resultArray);

            return resultArray;
        }
    }
}
